// 判断割点
// https://soj.turingedu.cn/problem/60702/

int n, m;
vector<int> adj[maxn];
int dfn_cnt, dfn[maxn], low[maxn];
int cut[maxn];
void dfs(int u, int p) {
    int ch = 0; // 子节点个数
    dfn[u] = low[u] = ++dfn_cnt;
    for (auto v : adj[u]) {
        if (v == p) continue;
        if (!dfn[v]) { // 树边
            dfs(v, u);
            low[u] = min(low[u], low[v]);
            if (p == 0 && ++ch > 1 || p && low[v] >= dfn[u]) cut[u] = 1;
        } else { // 返祖边
            low[u] = min(low[u], dfn[v]);
        }
    }
}
